package persistencia;

import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;

import javax.swing.JOptionPane;

import logica.Categoria;
import logica.Juego;

public class PersistirJuego extends Persistir{

	public PersistirJuego(){}
	
/**********************************************************************************************************/
	/*****************************************************************************************************/
	/*------------------------ COMPRAR JUEGO -------------------*/
	
	//DEVUELVE COMO RESULTADO LOS DATOS DE TODOS LOS JUEGOS
	public ResultSet getDatosDeCompra(){
		ResultSet juegos = null;
		try {
			Statement obtener = this.getConexion().createStatement();
			ResultSet rs = obtener.executeQuery("SELECT Id, Nombre, Descripcion, Precio FROM Juego");
			juegos = rs;
		}
		catch (Exception e) {
			JOptionPane.showMessageDialog(null,"ERROR AL CONECTAR LA BASE DE DATOS EN getDatosDeCompra");
		}
		return juegos;
	}
	
	
	
/**********************************************************************************************************/
/*********************************************************************************************************/
	/*------------------------  CONSULTAR JUEGO  --------------------------*/
	
	//DEVUELVE COMO RESULTADO EL NOMBRE DE TODOS LOS JUEGOS DE CATEGORIA
	public ResultSet getJuegosDeCategoria(String categoria){
		ResultSet juegos = null;

		try {
			Statement obtener = this.getConexion().createStatement();
			ResultSet rs = obtener.executeQuery(""
					+ "SELECT j.Nombre "
					+ "FROM Categoria_Juego as cj, Juego as j "
					+ "WHERE cj.Id_Juego = j.Id AND "
					+ "Nombre_Categoria = '"+categoria.toUpperCase()+"'");
			juegos = rs;
		}
		catch (Exception e) {
			e.printStackTrace();
		}
		return juegos;
	}
	
	
	//DEVUELVE TODOS LOS DATOS DE JUEGO CON NOMBRE
	public ResultSet getInfoJuego(String nombre){
		ResultSet info = null;
		try {
			Statement obtener = this.getConexion().createStatement();
			ResultSet rs = obtener.executeQuery("SELECT * FROM Juego WHERE Nombre = '"+nombre.toUpperCase()+"'");
			info = rs;
		}
		catch (Exception e) {
			JOptionPane.showMessageDialog(null,"ERROR AL CONECTAR LA BASE DE DATOS EN getInfoJuego");
		}
		return info;
	}
	
	
	//DEVULEVE COMO RESULTADO EL NICK DEL JUEGO CON NOMBRE
	public ResultSet getDesarrollador(int id){
		ResultSet des = null;
		try {
			Statement obtener = this.getConexion().createStatement();
			ResultSet rs = obtener.executeQuery(""
					+ "SELECT d.Nick "
					+ "FROM Desarrollador_Juego dj, Desarrollador d "
					+ "WHERE dj.Id_Desarrollador = d.Id AND "
					+ "dj.Id_Juego = '"+id+"'");
			des = rs;
		}
		catch (Exception e) {
			JOptionPane.showMessageDialog(null,"ERROR AL CONECTAR LA BASE DE DATOS EN getDesarrollador");
		}
		return des;
	}
	
	
	//DEVULEVE COMO RESULTADO TODOS LOS CLIENTES QUE COMPRARON EL JUEGO DE ID
	public ResultSet getClientes(int id){
		ResultSet clientes = null;
		try {
			Statement obtener = this.getConexion().createStatement();
			ResultSet rs = obtener.executeQuery(""
					+ "SELECT cli.Nick "
					+ "FROM Compra com, Cliente cli "
					+ "WHERE com.Id_Cliente = cli.Id AND "
					+ "com.Id_Juego = '"+id+"'");
			clientes = rs;
		}
		catch (Exception e) {
			JOptionPane.showMessageDialog(null,"ERROR AL CONECTAR LA BASE DE DATOS EN getClientes");
		}
		return clientes;
	}
	
	
	//DEVUELVE COMO RESULTADO TODAS LAS CATEGORIAS DEL JUEGO CON ID
	public ResultSet getCategorias(int id){
		ResultSet categorias = null;
		try {
			Statement obtener = this.getConexion().createStatement();
			ResultSet rs = obtener.executeQuery(""
					+ "SELECT cj.Nombre_Categoria "
					+ "FROM Categoria_Juego cj "
					+ "WHERE cj.Id_juego = '"+id+"'");
			categorias = rs;
		}
		catch (Exception e) {
			JOptionPane.showMessageDialog(null,"ERROR AL CONECTAR LA BASE DE DATOS EN getCategorias");
		}
		return categorias;
	}
	
	
	//DEVULEVE COMO RESULTADO LOS COMENTARIOS DEL JUEGO CON NOMBRE
	public ResultSet getComentarios(String nombre){
		ResultSet comenatrios = null;
		try {
			Statement obtener = this.getConexion().createStatement();
			ResultSet rs = obtener.executeQuery(""
					+ "SELECT com.Id, com.Texto, com.Fecha, cli.Nick, com.Id_Respuesta "
					+ "FROM Comentario com, Cliente cli, Juego j "
					+ "WHERE com.Id_cliente = cli.Id AND "
					+ "com.Id_Juego = j.Id AND "
					+ "j.Nombre = '"+nombre.toUpperCase()+"'");
			comenatrios = rs;
		}
		catch (Exception e) {
			JOptionPane.showMessageDialog(null,"ERROR AL CONECTAR LA BASE DE DATOS EN getComentarios");
		}
		return comenatrios;
	}

	
	
	
/**********************************************************************************************************/
/*********************************************************************************************************/
	/*------------------------ ALTA DE JUEGO    --------------------------*/
	
	//AGREGA UN JUEGO A LA BD Y LO DEVULEVE CON SU ID
	public Juego addJuego(Juego nuevo) {
		try {
			
			String sql = "INSERT INTO Juego (Nombre, Descripcion, Tamanio, Precio) VALUES (?,?,?,?)";
			PreparedStatement agregar = getConexion().prepareStatement(sql);
			agregar.setString(1, nuevo.getNombre());
			agregar.setString(2, nuevo.getDescripcion());
			agregar.setInt(3, nuevo.getTamanio());
			agregar.setFloat(4, nuevo.getPrecio());
			agregar.executeUpdate();
			agregar.close();
			
			sql = "SELECT Id FROM Juego WHERE Nombre = ?";
			agregar = getConexion().prepareStatement(sql);
			agregar.setString(1, nuevo.getNombre());
			ResultSet rs = agregar.executeQuery();
			int id = rs.getInt("Id");
			rs.close();
			
			nuevo.setId(id);
			
			sql = "INSERT INTO Categoria_Juego (Nombre_Categoria, Id_Juego) VALUES (?,?)";
			for (Categoria categoria : nuevo.getCategorias()) 	
			{
				agregar = getConexion().prepareStatement(sql);
				agregar.setString(1, categoria.getNombre());
				agregar.setInt(2, id);
				agregar.executeUpdate();
				agregar.close();
			}
			
			sql = "SELECT Id FROM Desarrollador WHERE Nick = ?";
			agregar = getConexion().prepareStatement(sql);
			agregar.setString(1, nuevo.getDesarrollador());
			rs = agregar.executeQuery();
			int idDes = rs.getInt("Id");
			rs.close();
			
			sql = "INSERT INTO Desarrollador_Juego (Id_Juego, Id_Desarrollador) VALUES (?,?)";
			agregar = getConexion().prepareStatement(sql);
			agregar.setInt(1, id);
			agregar.setInt(2, idDes);
			agregar.executeUpdate();
			agregar.close();
			
		} 
		catch (Exception e) {
			JOptionPane.showMessageDialog(null,"ERROR AL CONECTAR LA BASE DE DATOS EN addJuego");
		}
		
		return nuevo;
	}
	
	
	//DEVUELVE TRUE SI EL JUEGO EXISTE, TRUE EN OTRO CASO
	public boolean existeJuego (String nombre){
		boolean existe = true;
		try{
			Statement consulta = this.getConexion().createStatement();
			ResultSet rs1=  consulta.executeQuery("SELECT Nombre FROM Juego WHERE Nombre = '"+nombre.toUpperCase()+"'");
			existe = rs1.next();
			consulta.close();
			consulta.getConnection();
		}
		catch (SQLException e) {
			JOptionPane.showMessageDialog(null,"ERROR AL CONECTAR LA BASE DE DATOS EN existeJuego");
		}
		return existe;
	}

	
	
/**********************************************************************************************************/
/*********************************************************************************************************/
	/*------------------------     --------------------------*/

}
